Error in UseMethod("left_join") : 
  no applicable method for 'left_join' applied to an object of class "c('SpatialPolygonsDataFrame', 'SpatialPolygons', 'Spatial')"

First need to join up the real property data (Open Baltimore) the sales data (provided by Steve, and with deed dates from January 1, 2010 through October 2018) so we have a neighborhood for as many sales as we can.

1,153 sales didn’t match to a block-lot in the real property table, which means that the block-lot jointly was not in the real prop table.

Also, there are about 16,000 properties in the real prop table that don’t have a neighborhood.

So after joining we end up with 9,428 sales that don’t have a neighborhood.

The real property table also gives if it is principal residence or not, so we’ll also filter for the sales that are for principal residences.

Distribution of city-wide 2018 sales prices:

   85% 
275000 

Include Permits

Neighborhood Summary Table, 2015-2017

We have 16128 samples to work with that are in 2015-2017, have a neighborhood, were an arms-length sale, and are the principal residence.

Which neighborhoods have less than 20 sales meeting the criteria?

84 neighborhoods have less than 20 sales meeting the criteria. We’ll exclude them going forward so we have a reasonable sample size.

98th Percentile

Criteria & Results

There are 170 sales that meet the following criteria:

  • Deed date was between January 1, 2018 and October 5, 2018
  • Arms-length sale
  • Principal residence
  • Neighborhood had at least 20 sales
  • 98th percentile for sales prices for their neighborhood.

(If this yield isn’t high enough we can bump it down to the 95th percentile.)

Map

Full list

Detect jumps

99th Percentile

Criteria & Results

There are 170 sales that meet the following criteria:

  • Deed date was between January 1, 2018 and October 5, 2018
  • Arms-length sale
  • Principal residence
  • Neighborhood had at least 20 sales
  • 99th percentile for sales prices for their neighborhood.

(If this yield isn’t high enough we can bump it down to the 95th percentile.)

In Middle Neighborhood, 99th Percentile for Neighborhood, Over $250k, Over $10k Permit Activity

The following criteria are used below:

[1] 46

Further filter for permit value totals over $10,000.

Results in 27 properties.

[1] 28

MRIS data Nov 2018 - February 2019

LS0tDQp0aXRsZTogIlJlY2VudCBTYWxlcyBPdXRsaWVycyINCmF1dGhvcjogIkp1c3RpbiBFbHN6YXN6LCBNYXlvcidzIE9mZmljZSBvZiBJbm5vdmF0aW9uIg0KZW1haWw6ICJqdXN0aW4uZWxzemFzekBiYWx0aW1vcmVjaXR5LmdvdiINCmRhdGU6ICJUaHVyc2RheSwgRmVicnVhcnkgMjgsIDIwMTkiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZmlnX2hlaWdodDogNQ0KICAgIGZpZ193aWR0aDogMTANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGluY2x1ZGUgPSBULA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNSwgDQogICAgICAgICAgICAgICAgICAgICAgb3V0LndpZHRoID0gIjEwMCUiLCBvdXQuaGVpZ2h0ID0gIjEwMCUiKQ0KYGBgDQoNCg0KYGBge3J9DQpzb3VyY2UoIi4uL3NyYy8wMF9pbml0aWFsaXplLlIiKQ0Kc2FsZXMgPC0gbG9hZF9zYWxlc19kYXRhKGxvYWQuY2FjaGUgPSBUKQ0KDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoUlNvY3JhdGEpDQpsaWJyYXJ5KHNwKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShST0RCQykNCmxpYnJhcnkoaHRtbHRvb2xzKQ0KDQpyZWFsLnByb3AudXJsIDwtICJodHRwczovL2RhdGEuYmFsdGltb3JlY2l0eS5nb3YvcmVzb3VyY2UvNmFjdC1xenV5Lmpzb24iDQpyZWFsLnByb3AgPC0gcmVhZC5zb2NyYXRhKHJlYWwucHJvcC51cmwsIGFwcF90b2tlbiA9IFZBUlMkU09DUkFUQV9UT0tFTikNCg0KaG9vZHMgPC0gZ2V0X25laWdoYm9yaG9vZF9ib3VuZGFyaWVzKCkNCmhtdCA8LSBsb2FkX2Jsb2NrX2dyb3VwX2RhdGEobG9hZC5jYWNoZSA9IFQpDQpobXQuaG9vZCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL3Jhdy9obXQvSE1UIGJ5IE5laWdoYm9yaG9vZCAyMDE3Lnhsc3giKQ0KDQpjb25uLmdpcyA8LSBvZGJjRHJpdmVyQ29ubmVjdCgNCiAgcGFzdGUwKA0KICAgICdkcml2ZXI9e09EQkMgRHJpdmVyIDEzIGZvciBTUUwgU2VydmVyfTsnLA0KICAgICdzZXJ2ZXI9JywgVkFSUyRFR0lTX1NFUlZFUiwgDQogICAgJzt1aWQ9JywgVkFSUyRFR0lTX1NFUlZFUl9VU0VSLA0KICAgICc7cHdkPScsVkFSUyRFR0lTX1NFUlZFUl9QV0QsIA0KICAgICc7ZGF0YWJhc2U9aG91c2luZzt0cnVzdGVkX2Nvbm5lY3Rpb249Tm8nKQ0KKQ0KDQpwZXJtaXRzIDwtIHNxbEZldGNoKGNvbm4uZ2lzLCAiaG91c2luZy50YmxfUGVybWl0IikNCg0KbXJpcy5yZWNlbnQgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9yYXcvc2FsZXMvTm92IDIwMTggLSBGZWIgMjAxOSBzYWxlcyBmb3IgSnVzdGluLnhsc3giKQ0KYGBgDQoNCmBgYHtyfQ0KIyBqb2luIEhNVCBob29kIGxhYmVscyB0byBob29kIGJvdW5kYXJpZXMNCg0KaG9vZHNAZGF0YSA8LSBob29kc0BkYXRhICU+JSBsZWZ0X2pvaW4oaG10Lmhvb2QsIGJ5ID0gYygibGFiZWwiID0gIk5laWdoYm9yaG9vZCIpKQ0KYGBgDQoNCg0KRmlyc3QgbmVlZCB0byBqb2luIHVwIHRoZSByZWFsIHByb3BlcnR5IGRhdGEgKFtPcGVuIEJhbHRpbW9yZV0oW2h0dHA6Ly9kYXRhLmJhbHRpbW9yZWNpdHkuZ292L0ZpbmFuY2lhbC9SZWFsLVByb3BlcnR5LVRheGVzLzI3dzktdXJ0dnRvKSkgdGhlIHNhbGVzIGRhdGEgKHByb3ZpZGVkIGJ5IFN0ZXZlLCBhbmQgd2l0aCAqKmRlZWQgZGF0ZXMgZnJvbSBKYW51YXJ5IDEsIDIwMTAgdGhyb3VnaCBPY3RvYmVyIDIwMTgqKikgc28gd2UgaGF2ZSBhIG5laWdoYm9yaG9vZCBmb3IgYXMgbWFueSBzYWxlcyBhcyB3ZSBjYW4uDQoNCmBgYHtyfQ0Kc2FsZXMgPC0gc2FsZXMgJT4lIHJlbmFtZShzYWxlcy5ibG9jayA9IEJsb2NrLCBzYWxlcy5sb3QgPSBMb3QpDQpyZWFsLnByb3AgPC0gcmVhbC5wcm9wICU+JSByZW5hbWUocmVhbC5ibG9jayA9IGJsb2NrLCByZWFsLmxvdCA9IGxvdCkNCmBgYA0KDQpgYGB7cn0NCnJlYWwucHJvcCA8LSByZWFsLnByb3AgJT4lDQogIG11dGF0ZShyZWFsLmJsb2NrLmNsZWFuID0gZ3N1YigiXjArIiwgIiIsIHJlYWwuYmxvY2spLA0KICAgICAgICAgcmVhbC5sb3QuY2xlYW4gPSBnc3ViKCJeMCsiLCAiIiwgcmVhbC5sb3QpKQ0KDQpzYWxlcyA8LSBzYWxlcyAlPiUNCiAgbXV0YXRlKHNhbGVzLmJsb2NrLmNsZWFuID0gZ3N1YigiXjArIiwgIiIsIHNhbGVzLmJsb2NrKSwNCiAgICAgICAgIHNhbGVzLmxvdC5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBzYWxlcy5sb3QpKQ0KYGBgDQoNCmBgYHtyfQ0Kc2FsZXMgPC0gc2FsZXMgJT4lDQogIGxlZnRfam9pbihyZWFsLnByb3AsIA0KICAgICAgICAgICAgYnkgPSBjKCJzYWxlcy5ibG9jay5jbGVhbiIgPSAicmVhbC5ibG9jay5jbGVhbiIsDQogICAgICAgICAgICAgICAgICAgInNhbGVzLmxvdC5jbGVhbiIgPSAicmVhbC5sb3QuY2xlYW4iKQ0KICAgICAgICAgICAgKQ0KYGBgDQoNCmBgYHtyfQ0Kc2FsZXMgJT4lIGNvdW50KGlzLm5hKHJlYWwuYmxvY2spLCBpcy5uYShyZWFsLmxvdCkpDQpgYGANCg0KMSwxNTMgc2FsZXMgZGlkbid0IG1hdGNoIHRvIGEgYmxvY2stbG90IGluIHRoZSByZWFsIHByb3BlcnR5IHRhYmxlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBibG9jay1sb3Qgam9pbnRseSB3YXMgbm90IGluIHRoZSByZWFsIHByb3AgdGFibGUuIA0KDQpBbHNvLCB0aGVyZSBhcmUgYWJvdXQgMTYsMDAwIHByb3BlcnRpZXMgaW4gdGhlIHJlYWwgcHJvcCB0YWJsZSB0aGF0IGRvbid0IGhhdmUgYSBuZWlnaGJvcmhvb2QuIA0KDQpgYGB7cn0NCnJlYWwucHJvcCAlPiUgY291bnQoaXMubmEobmVpZ2hib3Job29kKSkNCmBgYA0KDQpTbyBhZnRlciBqb2luaW5nIHdlIGVuZCB1cCB3aXRoIDksNDI4IHNhbGVzIHRoYXQgZG9uJ3QgaGF2ZSBhIG5laWdoYm9yaG9vZC4NCg0KYGBge3J9DQpzYWxlcyAlPiUgY291bnQoIWlzLm5hKG5laWdoYm9yaG9vZCkpDQpgYGANCg0KVGhlIHJlYWwgcHJvcGVydHkgdGFibGUgYWxzbyBnaXZlcyBpZiBpdCBpcyBwcmluY2lwYWwgcmVzaWRlbmNlIG9yIG5vdCwgc28gd2UnbGwgYWxzbyBmaWx0ZXIgZm9yIHRoZSBzYWxlcyB0aGF0IGFyZSBmb3IgcHJpbmNpcGFsIHJlc2lkZW5jZXMuDQoNCmBgYHtyfQ0Kc2FsZXMgJT4lIGNvdW50KHJlc2NvZGUpDQpgYGANCg0KRGlzdHJpYnV0aW9uIG9mIGNpdHktd2lkZSAyMDE4IHNhbGVzIHByaWNlczoNCg0KYGBge3J9DQpzYWxlcyAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSA9PSAyMDE4KSAlPiUNCiAgZ2dwbG90KGFlcyhgU2FsZXMgUHJpY2VgKSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpICsNCiAgdGhlbWVfaXRlYW1fZ29vZ2xlX2RvY3MoKSArDQogIHhsaW0oYygwLCA1MDAwMDApKQ0KYGBgDQoNCmBgYHtyfQ0KcXVhbnRpbGUoc2FsZXMkYFNhbGVzIFByaWNlYCwgMC44NSkNCmBgYA0KIA0KIyMgSW5jbHVkZSBQZXJtaXRzIA0KDQpgYGB7cn0NCnBlcm1pdHMgJT4lIGNvdW50KGNzbV9zdGF0dXMpDQpgYGANCg0KYGBge3J9DQpwZXJtaXRzICU+JSBjb3VudChjc21fdHlwZV93b3JrKQ0KYGBgDQoNCiMgTmVpZ2hib3Job29kIFN1bW1hcnkgVGFibGUsIDIwMTUtMjAxNw0KDQpgYGB7cn0NCm1lZXQuY3JpdGVyaWEgPC0gc2FsZXMgJT4lDQogIGZpbHRlcih5ZWFyKGRlZWQuZGF0ZSkgJWluJSBjKDIwMTUsIDIwMTYsIDIwMTcpLA0KICAgICAgICAgIWlzLm5hKG5laWdoYm9yaG9vZCksDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIG5yb3cNCmBgYA0KDQpXZSBoYXZlIGByIG1lZXQuY3JpdGVyaWFgIHNhbXBsZXMgdG8gd29yayB3aXRoIHRoYXQgYXJlIGluIDIwMTUtMjAxNywgaGF2ZSBhIG5laWdoYm9yaG9vZCwgd2VyZSBhbiBhcm1zLWxlbmd0aCBzYWxlLCBhbmQgYXJlIHRoZSBwcmluY2lwYWwgcmVzaWRlbmNlLg0KDQpgYGB7cn0NCnNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCA8LSBzYWxlcyAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNyksDQogICAgICAgICAhaXMubmEobmVpZ2hib3Job29kKSwNCiAgICAgICAgIGBIb3cgQ29udmV5ZWRgID09IDEsDQogICAgICAgICAhZ3JlcGwoIk5PVCIsIHJlc2NvZGUpKSAlPiUNCiAgZ3JvdXBfYnkobmVpZ2hib3Job29kKSAlPiUNCiAgc3VtbWFyaXNlKGhvb2QubiA9IG4oKSwNCiAgICAgICAgICAgIGhvb2QubWVhbiA9IG1lYW4oYFNhbGVzIFByaWNlYCksDQogICAgICAgICAgICBob29kLm1lZGlhbiA9IG1lZGlhbihgU2FsZXMgUHJpY2VgKSwNCiAgICAgICAgICAgIGhvb2Quc3RkID0gc3FydChzdW0oKGBTYWxlcyBQcmljZWAtaG9vZC5tZWFuKV4yLyhob29kLm4tMSkpKSwNCiAgICAgICAgICAgIGhvb2QuOTV0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk1KSwNCiAgICAgICAgICAgIGhvb2QuOTh0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk4KSwNCiAgICAgICAgICAgIGhvb2QuOTl0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk5KSkNCg0Kc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kICANCmBgYA0KDQpXaGljaCBuZWlnaGJvcmhvb2RzIGhhdmUgbGVzcyB0aGFuIDIwIHNhbGVzIG1lZXRpbmcgdGhlIGNyaXRlcmlhPw0KDQpgYGB7cn0NCnNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCAlPiUNCiAgZmlsdGVyKGhvb2QubiA8IDIwKQ0KYGBgDQoNCjg0IG5laWdoYm9yaG9vZHMgaGF2ZSBsZXNzIHRoYW4gMjAgc2FsZXMgbWVldGluZyB0aGUgY3JpdGVyaWEuIFdlJ2xsIGV4Y2x1ZGUgdGhlbSBnb2luZyBmb3J3YXJkIHNvIHdlIGhhdmUgYSByZWFzb25hYmxlIHNhbXBsZSBzaXplLg0KDQpgYGB7cn0NCiMgSm9pbiB0aGUgc3VtbWFyaWVzIHRvIHRoZSBuZWlnaGJvcmhvb2QgYm91bmRhcmllcw0KaG9vZHNAZGF0YSA8LSBob29kc0BkYXRhICU+JSANCiAgbGVmdF9qb2luKHNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCwNCiAgICAgICAgICAgIGJ5ID0gYygibGFiZWwiID0gIm5laWdoYm9yaG9vZCIpKQ0KYGBgDQoNCg0KIyA5OHRoIFBlcmNlbnRpbGUNCg0KIyMgQ3JpdGVyaWEgJiBSZXN1bHRzDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OHRoIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJuZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSA9PSAyMDE4LA0KICAgICAgICAgaG9vZC5uID49IDIwLA0KICAgICAgICAgYFNhbGVzIFByaWNlYCA+PSBob29kLjk4dGgsDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIGFycmFuZ2UobmVpZ2hib3Job29kKQ0KDQpyZXN1bHQuc2FsZXMgPC0gbnJvdyhzYWxlcy5ob29kLjk4dGgpDQpgYGANCg0KKipUaGVyZSBhcmUgYHIgcmVzdWx0LnNhbGVzYCBzYWxlcyB0aGF0IG1lZXQgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToqKg0KDQotIERlZWQgZGF0ZSB3YXMgYmV0d2VlbiBKYW51YXJ5IDEsIDIwMTggYW5kIE9jdG9iZXIgNSwgMjAxOA0KLSBBcm1zLWxlbmd0aCBzYWxlDQotIFByaW5jaXBhbCByZXNpZGVuY2UNCi0gTmVpZ2hib3Job29kIGhhZCBhdCBsZWFzdCAyMCBzYWxlcw0KLSA5OHRoIHBlcmNlbnRpbGUgZm9yIHNhbGVzIHByaWNlcyBmb3IgdGhlaXIgbmVpZ2hib3Job29kLg0KDQooSWYgdGhpcyB5aWVsZCBpc24ndCBoaWdoIGVub3VnaCB3ZSBjYW4gYnVtcCBpdCBkb3duIHRvIHRoZSA5NXRoIHBlcmNlbnRpbGUuKQ0KDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OHRoJGxvbmcgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTh0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsxXSkgJT4lIHVubGlzdCgpDQoNCnNhbGVzLmhvb2QuOTh0aCRsYXQgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTh0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsyXSkgJT4lIHVubGlzdCgpDQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gc2FsZXMuaG9vZC45OHRoICU+JSBmaWx0ZXIoIWlzLm5hKGxvbmcpKQ0KICANCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSgNCiAgc2FsZXMuaG9vZC45OHRoLmdlbyAlPiUgc2VsZWN0KGxvbmcsIGxhdCksIA0KICBzYWxlcy5ob29kLjk4dGguZ2VvLA0KICBwcm9qNHN0cmluZyA9IENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMgK2VsbHBzPVdHUzg0ICt0b3dnczg0PTAsMCwwIikpDQoNCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gDQogIHNwVHJhbnNmb3JtKA0KICAgIHNhbGVzLmhvb2QuOTh0aC5nZW8sIA0KICAgIENSU29iaiA9IENSUygiK2luaXQ9ZXBzZzo0MzI2ICtwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzICtlbGxwcz1XR1M4NCArdG93Z3M4ND0wLDAsMCIpDQogICAgKQ0KDQpgYGANCg0KIyMgTWFwDQoNCmBgYHtyfQ0KbGlicmFyeShodG1sdG9vbHMpDQoNCmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPjIwMTcgSG91c2luZyBNYXJrZXQgVHlwb2xvZ3k6ICIsIGhvb2RzJGBQcmVkb21pbmFudCBDb2RlIElnbm9yaW5nIE5vbi1SZXNpZGVudGlhbGAsDQogICI8YnI+TWVkaWFuIFNhbGVzLCAyMDE1LTIwMTc6ICIsIGFzLmNoYXJhY3Rlcihob29kcyRob29kLm1lZGlhbikNCiAgDQopDQoNCnNhbGUubGFiZWxzIDwtIHBhc3RlMCgNCiAgc2FsZXMuaG9vZC45OHRoLmdlbyRgSG91c2UgI2AsICIgIiwNCiAgc2FsZXMuaG9vZC45OHRoLmdlbyRgU3RyZWV0IE5hbWVgLCAiICIsDQogIHNhbGVzLmhvb2QuOTh0aC5nZW8kU3VmZml4LCANCiAgIjxicj5TYWxlIFByaWNlIGluIDIwMTg6ICIsIA0KICBhcy5jaGFyYWN0ZXIoc2FsZXMuaG9vZC45OHRoLmdlbyRgU2FsZXMgUHJpY2VgKSwNCiAgIjxicj5OZXcgT3duZXI6ICIsIHNhbGVzLmhvb2QuOTh0aC5nZW8kbmV3Lm93bmVyDQopDQoNCg0KbGVhZmxldCgpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC03Ni42LCBsYXQgPSAzOS4zLCB6b29tID0gMTEpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRTdGFtZW4uVG9uZXJMaXRlKSAlPiUgDQogIGFkZFBvbHlnb25zKGRhdGEgPSBob29kcywgDQogICAgICAgICAgICAgIHdlaWdodCA9IDIsIA0KICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwgDQogICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gc2FsZXMuaG9vZC45OHRoLmdlbywgDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gMiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoc2FsZS5sYWJlbHMsIEhUTUwpKQ0KYGBgDQoNCiMjIEZ1bGwgbGlzdA0KDQpgYGB7cn0NCnNhbGVzLmhvb2QuOTh0aCANCmBgYA0KDQojIERldGVjdCBqdW1wcw0KDQpgYGB7cn0NCiNsb29rIGZvciB0ZW1wb3JhbCBqdW1wcyBpbiBwcmljZXMNCmBgYA0KDQojIDk5dGggUGVyY2VudGlsZQ0KDQojIyBDcml0ZXJpYSAmIFJlc3VsdHMNCg0KYGBge3J9DQpzYWxlcy5ob29kLjk5dGggPC0gc2FsZXMgJT4lDQogIGxlZnRfam9pbihzYWxlcy5zdW1tYXJ5LjE1XzE3LmJ5Lmhvb2QsDQogICAgICAgICAgICBieSA9IGMoIm5laWdoYm9yaG9vZCIgPSAibmVpZ2hib3Job29kIikpICU+JQ0KICBmaWx0ZXIoeWVhcihkZWVkLmRhdGUpID09IDIwMTgsDQogICAgICAgICBob29kLm4gPj0gMjAsDQogICAgICAgICBgU2FsZXMgUHJpY2VgID49IGhvb2QuOTl0aCwNCiAgICAgICAgIGBIb3cgQ29udmV5ZWRgID09IDEsDQogICAgICAgICAhZ3JlcGwoIk5PVCIsIHJlc2NvZGUpKSAlPiUNCiAgYXJyYW5nZShuZWlnaGJvcmhvb2QpDQoNCnJlc3VsdC5zYWxlcyA8LSBucm93KHNhbGVzLmhvb2QuOTl0aCkNCmBgYA0KDQoqKlRoZXJlIGFyZSBgciByZXN1bHQuc2FsZXNgIHNhbGVzIHRoYXQgbWVldCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOioqDQoNCi0gRGVlZCBkYXRlIHdhcyBiZXR3ZWVuIEphbnVhcnkgMSwgMjAxOCBhbmQgT2N0b2JlciA1LCAyMDE4DQotIEFybXMtbGVuZ3RoIHNhbGUNCi0gUHJpbmNpcGFsIHJlc2lkZW5jZQ0KLSBOZWlnaGJvcmhvb2QgaGFkIGF0IGxlYXN0IDIwIHNhbGVzDQotIDk5dGggcGVyY2VudGlsZSBmb3Igc2FsZXMgcHJpY2VzIGZvciB0aGVpciBuZWlnaGJvcmhvb2QuDQoNCihJZiB0aGlzIHlpZWxkIGlzbid0IGhpZ2ggZW5vdWdoIHdlIGNhbiBidW1wIGl0IGRvd24gdG8gdGhlIDk1dGggcGVyY2VudGlsZS4pDQoNCg0KYGBge3J9DQpzYWxlcy5ob29kLjk5dGgkbG9uZyA8LSBsYXBwbHkoc2FsZXMuaG9vZC45OXRoJGxvY2F0aW9uLmNvb3JkaW5hdGVzLCBmdW5jdGlvbih4KSB4WzFdKSAlPiUgdW5saXN0KCkNCg0Kc2FsZXMuaG9vZC45OXRoJGxhdCA8LSBsYXBwbHkoc2FsZXMuaG9vZC45OXRoJGxvY2F0aW9uLmNvb3JkaW5hdGVzLCBmdW5jdGlvbih4KSB4WzJdKSAlPiUgdW5saXN0KCkNCmBgYA0KDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OXRoLmdlbyA8LSBzYWxlcy5ob29kLjk5dGggJT4lIGZpbHRlcighaXMubmEobG9uZykpDQogIA0Kc2FsZXMuaG9vZC45OXRoLmdlbyA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKA0KICBzYWxlcy5ob29kLjk5dGguZ2VvICU+JSBzZWxlY3QobG9uZywgbGF0KSwgDQogIHNhbGVzLmhvb2QuOTl0aC5nZW8sDQogIHByb2o0c3RyaW5nID0gQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCArbm9fZGVmcyArZWxscHM9V0dTODQgK3Rvd2dzODQ9MCwwLDAiKSkNCg0Kc2FsZXMuaG9vZC45OXRoLmdlbyA8LSANCiAgc3BUcmFuc2Zvcm0oDQogICAgc2FsZXMuaG9vZC45OXRoLmdlbywgDQogICAgQ1JTb2JqID0gQ1JTKCIraW5pdD1lcHNnOjQzMjYgK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMgK2VsbHBzPVdHUzg0ICt0b3dnczg0PTAsMCwwIikNCiAgICApDQoNCmBgYA0KDQpgYGB7cn0NCg0Kc2FsZS5sYWJlbHMgPC0gcGFzdGUwKA0KICBzYWxlcy5ob29kLjk5dGguZ2VvJGBIb3VzZSAjYCwgIiAiLA0KICBzYWxlcy5ob29kLjk5dGguZ2VvJGBTdHJlZXQgTmFtZWAsICIgIiwNCiAgc2FsZXMuaG9vZC45OXRoLmdlbyRTdWZmaXgsIA0KICAiPGJyPlNhbGUgUHJpY2UgaW4gMjAxODogIiwgDQogIGFzLmNoYXJhY3RlcihzYWxlcy5ob29kLjk5dGguZ2VvJGBTYWxlcyBQcmljZWApLA0KICAiPGJyPk5ldyBPd25lcjogIiwgc2FsZXMuaG9vZC45OXRoLmdlbyRuZXcub3duZXINCikNCg0KDQpsZWFmbGV0KCkgJT4lDQogIHNldFZpZXcobG5nID0gLTc2LjYsIGxhdCA9IDM5LjMsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lckxpdGUpICU+JSANCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhvb2RzLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDAuNSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLCANCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KGhvb2RzLmxhYmVscywgSFRNTCkpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBzYWxlcy5ob29kLjk5dGguZ2VvLCANCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLA0KICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShzYWxlLmxhYmVscywgSFRNTCkpDQpgYGANCg0KYGBge3J9DQplbWlseS5saXN0IDwtIGMoIjQwMTEgQkFSUklOR1RPTiIsDQogICAgICAgICAgICAgICAgIkRPUkNIRVNURVIiLA0KICAgICAgICAgICAgICAgICIyMzE5IE1PTlRJQ0VMTE8iKQ0KDQpzYWxlcy5ob29kLjk4dGguZ2VvQGRhdGEgJT4lIA0KICBmaWx0ZXIoZ3JlcGwocGFzdGUoZW1pbHkubGlzdCwgY29sbGFwc2U9InwiKSwgcHJvcGVydHlhZGRyZXNzKSkNCmBgYA0KDQojIEluIE1pZGRsZSBOZWlnaGJvcmhvb2QsIDk5dGggUGVyY2VudGlsZSBmb3IgTmVpZ2hib3Job29kLCBPdmVyICQyNTBrLCBPdmVyICQxMGsgUGVybWl0IEFjdGl2aXR5DQoNClRoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYXJlIHVzZWQgYmVsb3c6DQoNCi0gRGVlZCBkYXRlIHdhcyBiZXR3ZWVuIEphbnVhcnkgMSwgMjAxOCBhbmQgT2N0b2JlciA1LCAyMDE4DQotIEFybXMtbGVuZ3RoIHNhbGUNCi0gUHJpbmNpcGFsIHJlc2lkZW5jZQ0KLSBOZWlnaGJvcmhvb2QgaGFkIGF0IGxlYXN0IDIwIHNhbGVzDQotIDk5dGggcGVyY2VudGlsZSBmb3Igc2FsZXMgcHJpY2VzIGZvciB0aGVpciBuZWlnaGJvcmhvb2QuDQotIFNhbGUgcHJpY2Ugb3ZlciAkMjUwLDAwMA0KLSBQZXJtaXRzIGlzc3VlZCBiZXR3ZWVuIDIwMTctMjAxOA0KLSBUb3RhbCBwZXJtaXQgdmFsdWUgYXQgbGVhc3QgJDEwLDAwMA0KDQpgYGB7cn0NCnBlcm1pdHMucmVjZW50IDwtIHBlcm1pdHMgJT4lIA0KICBmaWx0ZXIoY3NtX2lzc3VlZF9kYXRlID49ICIyMDE3LTAxLTAxIikgJT4lDQogIG11dGF0ZShwZXJtaXQuYmxvY2suY2xlYW4gPSBnc3ViKCJeMCsiLCAiIiwgcHJjX2Jsb2NrX25vKSwNCiAgICAgICAgIHBlcm1pdC5sb3QuY2xlYW4gPSBnc3ViKCJeMCsiLCAiIiwgcHJjX2xvdCkpDQoNCnBlcm1pdHMucmVjZW50LnN1bW1hcnkgPC0gcGVybWl0cy5yZWNlbnQgJT4lDQogIGdyb3VwX2J5KHBlcm1pdC5ibG9jay5jbGVhbiwgcGVybWl0LmxvdC5jbGVhbikgJT4lDQogIHN1bW1hcmlzZShwZXJtaXQuY291bnQgPSBuKCksDQogICAgICAgICAgICBwZXJtaXQudG90YWwudmFsdWUgPSBzdW0oY3NtX2Nvc3QsIG5hLnJtID0gVCkpDQpgYGANCg0KYGBge3J9DQptaWQuaG9vZHMgPC0gaG10Lmhvb2QgJT4lIGZpbHRlcihgUHJlZG9taW5hbnQgQ29kZSBJZ25vcmluZyBOb24tUmVzaWRlbnRpYWxgICVpbiUgYygiRCIsICJFIiwgIkYiLCAiRyIsICJIIikpDQoNCnNhbGVzLjk5dGgubWlkLmhvb2QgPC0gc3Vic2V0KHNhbGVzLmhvb2QuOTl0aC5nZW8sIHRvbG93ZXIobmVpZ2hib3Job29kKSAlaW4lIHRvbG93ZXIobWlkLmhvb2RzJE5laWdoYm9yaG9vZCkpDQoNCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrIDwtIHN1YnNldChzYWxlcy45OXRoLm1pZC5ob29kLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTYWxlcyBQcmljZWAgPiAyNTAwMDApDQpgYGANCg0KYGBge3J9DQpzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUwa0BkYXRhICU+JSBucm93DQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrQGRhdGEgPC0gc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGtAZGF0YSAlPiUNCiAgbGVmdF9qb2luKHBlcm1pdHMucmVjZW50LnN1bW1hcnksIA0KICAgICAgICAgICAgYnkgPSBjKCJzYWxlcy5ibG9jay5jbGVhbiIgPSAicGVybWl0LmJsb2NrLmNsZWFuIiwNCiAgICAgICAgICAgICAgICAgICAic2FsZXMubG90LmNsZWFuIiA9ICJwZXJtaXQubG90LmNsZWFuIikpDQpgYGANCg0KRnVydGhlciBmaWx0ZXIgZm9yIHBlcm1pdCB2YWx1ZSB0b3RhbHMgb3ZlciAkMTAsMDAwLg0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQgPC0gc3Vic2V0KHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLCBwZXJtaXQudG90YWwudmFsdWUgPj0gMTAwMDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQpSZXN1bHRzIGluIDI3IHByb3BlcnRpZXMuDQoNCmBgYHtyfQ0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdEBkYXRhICU+JSBucm93DQpgYGANCg0KDQpgYGB7ciBvdXQud2lkdGg9IjEwMCUiLCB3aWR0aCA9IDh9DQoNCm1pZC5ob29kcy5nZW8gPC0gc3Vic2V0KGhvb2RzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHRvbG93ZXIobGFiZWwpICVpbiUgdG9sb3dlcihtaWQuaG9vZHMkTmVpZ2hib3Job29kKSkNCg0KDQoNCm1pZC5ob29kcy5sYWJlbHMgPC0gcGFzdGUwKA0KICBtaWQuaG9vZHMuZ2VvJGxhYmVsLA0KICAiPGJyPjIwMTcgSG91c2luZyBNYXJrZXQgVHlwb2xvZ3k6ICIsIG1pZC5ob29kcy5nZW8kYFByZWRvbWluYW50IENvZGUgSWdub3JpbmcgTm9uLVJlc2lkZW50aWFsYCwNCiAgIjxicj5NZWRpYW4gU2FsZXMsIDIwMTUtMjAxNzogIiwgYXMuY2hhcmFjdGVyKG1pZC5ob29kcy5nZW8kaG9vZC5tZWRpYW4pDQogIA0KKQ0KDQpzYWxlLmxhYmVscyA8LSBwYXN0ZTAoDQogICJBbmFseXNpczogU0RBVCAodGhyb3VnaCBPY3RvYmVyIDE4KTxicj4iLA0KICBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0JGBIb3VzZSAjYCwgIiAiLA0KICBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0JGBTdHJlZXQgTmFtZWAsICIgIiwNCiAgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRTdWZmaXgsIA0KICAiPGJyPlNhbGUgUHJpY2UgaW4gMjAxODogIiwgDQogIGFzLmNoYXJhY3RlcihzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0JGBTYWxlcyBQcmljZWApLA0KICAiPGJyPk5ldyBPd25lcjogIiwgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRuZXcub3duZXIsDQogICI8YnI+UGVybWl0cyBJc3N1ZWQgZnJvbSAyMDE3LTIwMTg6ICIsIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkcGVybWl0LmNvdW50LA0KICAiPGJyPlRvdGFsIFBlcm1pdCBWYWx1ZSBmcm9tIDIwMTctMjAxODogIiwgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRwZXJtaXQudG90YWwudmFsdWUNCikNCg0KDQpsZWFmbGV0KCkgJT4lDQogIHNldFZpZXcobG5nID0gLTc2LjYsIGxhdCA9IDM5LjMsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lckxpdGUpICU+JSANCiAgYWRkUG9seWdvbnMoZGF0YSA9IGhvb2RzLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwgDQogICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IG1pZC5ob29kcy5nZW8sIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgI2NvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDAuMCwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuMiwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gaXRlYW0uY29sb3JzWzNdLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkobWlkLmhvb2RzLmxhYmVscywgSFRNTCkpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0LCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1sxXSwNCiAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLA0KICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShzYWxlLmxhYmVscywgSFRNTCkpDQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXRAZGF0YQ0KYGBgDQoNCiMgTVJJUyBkYXRhIE5vdiAyMDE4IC0gRmVicnVhcnkgMjAxOQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dtYXApDQpyZWdpc3Rlcl9nb29nbGUoU3lzLmdldGVudigiR09PR0xFX0dFT19LRVkiKSkNCmBgYA0KDQojIyMgTGlzdCB0aGF0IEp1bGllICYgSnVzdGluIGZvdW5kIGR1cmluZyBkYXNoYm9hcmQgc2VhcmNoDQoNCmBgYHtyfQ0KanVsaWUubGlzdCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL3Jhdy9zYWxlcy9Ob3YgMjAxOCAtIEZlYiAyMDE5IHNhbGVzIGZvciBKdXN0aW4ueGxzeCIsIHNoZWV0ID0gMikNCmBgYA0KDQpgYGB7cn0NCmp1bGllLmxpc3QuZ2VvY29kZWQgPC0ganVsaWUubGlzdCAlPiUNCiAgbXV0YXRlKGZ1bGwuYWRkcmVzcyA9IHBhc3RlMChBZGRyZXNzLCAiLCBCYWx0aW1vcmUsIE1ELCAiLCBaaXBfQ29kZSkpICU+JQ0KICBtdXRhdGVfZ2VvY29kZShmdWxsLmFkZHJlc3MpDQoNCmp1bGllLmxpc3QuZ2VvY29kZWQNCg0KYGBgDQoNCmBgYHtyfQ0KZmlsZW5hbWUgPC0gIi4uL2RhdGEvcHJvY2Vzc2VkL01SSVNfb3V0bGllcnNfZ2VvY29kZWQucmRzIg0KDQppZiAoZmlsZS5leGlzdHMoZmlsZW5hbWUpID09IEYpew0KICANCiAgbXJpcy5yZWNlbnQub3V0bGllcnMgPC0gbXJpcy5yZWNlbnQgJT4lDQogICAgbGVmdF9qb2luKHNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCwNCiAgICAgICAgICAgICAgYnkgPSBjKCJOZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgICBmaWx0ZXIoaG9vZC5uID49IDIwLA0KICAgICAgICAgICBDbG9zZV9QcmljZSA+PSBob29kLjk5dGgpICU+JQ0KICAgIGFycmFuZ2UoTmVpZ2hib3Job29kKSAlPiUNCiAgICBtdXRhdGUoZnVsbC5hZGRyZXNzID0gcGFzdGUwKEFkZHJlc3MsICIsIEJhbHRpbW9yZSwgTUQsICIsIFppcF9Db2RlKSkgJT4lDQogICAgbXV0YXRlX2dlb2NvZGUoZnVsbC5hZGRyZXNzKQ0KICANCiAgc2F2ZVJEUyhtcmlzLnJlY2VudC5vdXRsaWVycywgZmlsZW5hbWUpDQogIA0KfQ0KDQptcmlzLnJlY2VudC5vdXRsaWVycyA8LSByZWFkUkRTKGZpbGVuYW1lKQ0KDQptcmlzLnJlY2VudC5vdXRsaWVycy5yZW5vIDwtIG1yaXMucmVjZW50Lm91dGxpZXJzICU+JSBmaWx0ZXIoIWlzLm5hKFllYXJfUmVub3ZhdGVkKSkNCmBgYA0KDQpgYGB7cn0NCm1yaXMuc2FsZS5sYWJlbHMgPC0gcGFzdGUwKA0KICAiQW5hbHlzaXM6IE1SSVMgKE5vdiAxOCAtIEZlYiAxOSk8YnI+IiwNCiAgbXJpcy5yZWNlbnQub3V0bGllcnMucmVubyRBZGRyZXNzLA0KICAiPGJyPkNsb3NlIERhdGU6ICIsIG1yaXMucmVjZW50Lm91dGxpZXJzLnJlbm8kQ2xvc2VfRGF0ZSwNCiAgIjxicj5TYWxlIFByaWNlIGluIDIwMTg6ICIsIA0KICBhcy5jaGFyYWN0ZXIobXJpcy5yZWNlbnQub3V0bGllcnMucmVubyRDbG9zZV9QcmljZSksDQogICI8YnI+UmVjZW50IFJlbm92YXRpb246ICIsIG1yaXMucmVjZW50Lm91dGxpZXJzLnJlbm8kWWVhcl9SZW5vdmF0ZWQNCikNCg0KanVsaWUubGlzdC5sYWJlbHMgPC0gcGFzdGUwKA0KICAiSnVsaWUvSnVzdGluIExpc3Q8YnI+IiwNCiAganVsaWUubGlzdC5nZW9jb2RlZCRBZGRyZXNzLA0KICAiPGJyPkNsb3NlIERhdGU6ICIsIGp1bGllLmxpc3QuZ2VvY29kZWQkQ2xvc2VfRGF0ZSwNCiAgIjxicj5TYWxlIFByaWNlIGluIDIwMTg6ICIsIA0KICBhcy5jaGFyYWN0ZXIoanVsaWUubGlzdC5nZW9jb2RlZCRDbG9zZV9QcmljZSksDQogICI8YnI+UmVjZW50IFJlbm92YXRpb246ICIsIGp1bGllLmxpc3QuZ2VvY29kZWQkWWVhcl9SZW5vdmF0ZWQNCikNCg0KDQpsZWFmbGV0KHdpZHRoID0gIjEwMCUiKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBtaWQuaG9vZHMuZ2VvLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgICNjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KG1pZC5ob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgICAgIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IGp1bGllLmxpc3QuZ2VvY29kZWQsDQpjb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLA0KICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShqdWxpZS5saXN0LmxhYmVscywgSFRNTCkpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBtcmlzLnJlY2VudC5vdXRsaWVycy5yZW5vLA0KDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLA0KICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShtcmlzLnNhbGUubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQsIA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZExlZ2VuZChwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsDQogICAgICAgICAgICBjb2xvcnMgPSBjKGl0ZWFtLmNvbG9yc1szXSwgInJlZCIsIGl0ZWFtLmNvbG9yc1sxXSksDQogICAgICAgICAgIGxhYmVscyA9IGMoIkp1c3Rpbi9KdWxpZSBMQiBEYXNoYm9hcmQgU2VhcmNoIiwgDQogICAgICAgICAgICAgICAgICAgICAgIk1SSVMgUmVjZW50IChOb3YgMTggLSBGZWIgMTkpICsgUmVjZW50IFJlbm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAiU0RBVCAoMjAxOCB0aHJ1IE9jdCkgKyAxMGsgUGVybWl0IiksDQogICAgICAgICAgIG9wYWNpdHkgPSAxKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K